package org.example.classtopia.Utils;

import java.time.LocalDate;
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class DateUtils {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 计算事件具体日期
     *
     * @param semesterStr 学期起始日期字符串，格式"yyyy-MM-dd"
     * @param week 学期中的周次，从1开始
     * @param dayOfWeek 星期几，1=周一，7=周日
     * @return 事件真实日期
     */
    public static LocalDate calculateEventDate(String semesterStr, int week, int dayOfWeek) {
        LocalDate semesterStart = LocalDate.parse(semesterStr, FORMATTER);
        // 计算学期第一周周一日期
        LocalDate firstMonday = semesterStart.with(DayOfWeek.MONDAY);
        // 根据周次和星期几计算事件日期
        return firstMonday.plusWeeks(week - 1).with(DayOfWeek.of(dayOfWeek));
    }

    /**
     * 获取给定学期起始日的周一，作为周次计算的基准点。
     * 例如，如果学期从2025-09-01（周一）开始，则返回2025-09-01。
     * 如果学期从2025-09-03（周三）开始，则返回2025-09-01。
     * @param semesterStartDateStr 学期起始日期字符串，格式"yyyy-MM-dd"
     * @return 学期第一周的周一日期
     */
    public static LocalDate getSemesterFirstMonday(String semesterStartDateStr) {
        LocalDate semesterStart = LocalDate.parse(semesterStartDateStr, FORMATTER);
        // 将学期开始日期调整到它所在周的周一
        return semesterStart.with(DayOfWeek.MONDAY);
    }

    /**
     * 计算当前日期是学期中的第几周。
     * 周次从1开始，以学期第一周的周一作为计算基准。
     * @param semesterStartDateStr 学期起始日期字符串，格式"yyyy-MM-dd"
     * @param currentDate 当前日期
     * @return 当前周次，从1开始
     */
    public static int calculateCurrentWeek(String semesterStartDateStr, LocalDate currentDate) {
        LocalDate firstMondayOfSemester = getSemesterFirstMonday(semesterStartDateStr);
        long daysBetween = ChronoUnit.DAYS.between(firstMondayOfSemester, currentDate);
        // 每7天算一周，+1是因为周次从1开始
        return (int) (daysBetween / 7) + 1;
    }
}


